package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.FonteDeRecursoDAO;
import br.com.duosoftware.orcamento.daos.PrevisaoDeReceitaDAO;
import br.com.duosoftware.orcamento.daos.PrevisaoFonteRecursoDAO;
import br.com.duosoftware.orcamento.entidades.FonteDeRecurso;
import br.com.duosoftware.orcamento.entidades.PrevisaoDeReceita;
import br.com.duosoftware.orcamento.entidades.PrevisaoFonteRecurso;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Renato
 * 
 */
@ManagedBean
@ViewScoped
public class PrevisaoFonteRecursoBean  implements Serializable {
     
    private PrevisaoFonteRecurso previsaoFonteRecurso;
    private List<PrevisaoFonteRecurso> previsoesFonteRecurso;
    private PrevisaoFonteRecursoDAO previsaoFonteRecursoDAO;
    //
    ///****Select Itens****
    //
    private List<SelectItem> previsoesDeReceita;
    private List<SelectItem> fontesDeRecurso;
    
    public PrevisaoFonteRecursoBean() {
        previsaoFonteRecursoDAO = new PrevisaoFonteRecursoDAO();
    }

    public PrevisaoFonteRecurso getPrevisaoFonteRecurso() {
        return previsaoFonteRecurso;
    }

    public void setPrevisaoFonteRecurso(PrevisaoFonteRecurso previsaoFonteRecurso) {
        this.previsaoFonteRecurso = previsaoFonteRecurso;
    }

    public List<PrevisaoFonteRecurso> getPrevisoesFonteRecurso() {
        if(previsoesFonteRecurso == null){
            
            previsoesFonteRecurso = previsaoFonteRecursoDAO.listarPrevisoesFonteRecurso();
            
        }
        return previsoesFonteRecurso;
    }

    public void setPrevisoesFonteRecurso(List<PrevisaoFonteRecurso> previsoesFonteRecurso) {
        this.previsoesFonteRecurso = previsoesFonteRecurso;
    }
    
    /**
     * <b>Método que inicializa o PrevisaoFonteRecurso a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        previsaoFonteRecurso = new PrevisaoFonteRecurso();
        
    }

    /**
     * <b>Método que adiciona ou edita um PrevisaoFonteRecurso</b><p>
     *
     * Após o término o método fecha o dialog de cadastro. <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        previsaoFonteRecursoDAO.salvarOuAtualizar(previsaoFonteRecurso);
        previsaoFonteRecurso = new PrevisaoFonteRecurso();
        previsoesFonteRecurso = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgPrevisaoFonteRecurso.hide()");
        requestContext.update("formPrevisoesFonteRecurso:dtPrevisoesFonteRecurso");

    }

    /**
     * <b>Método para iniciar o processo de edição de um PrevisaoFonteRecurso.</b> <p>
     *
     * Ele verifica se há um PrevisaoFonteRecurso selecionada para edição, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um PrevisaoFonteRecurso selecionado o médoto abre o dialog para edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (previsaoFonteRecurso == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgPrevisaoFonteRecurso.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um PrevisaoFonteRecurso.</b> <p>
     *
     * Ele verifica se há um PrevisaoFonteRecurso selecionado para exclusão, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um PrevisaoFonteRecurso selecionado o médoto abre um p:dialog para confirma
     * ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (previsaoFonteRecurso == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirPrevisaoFonteRecurso.show()");
        }

    }

    /**
     * <b>Método para excluir um PrevisaoFonteRecurso.</b> <p>
     *
     * Ele verifica se a PrevisaoFonteRecurso selecionado para exclusão está sendo utilizado
     * por alguma outra tabela do banco. Se estiver uma mensagem de aviso é dada
     * ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            previsaoFonteRecursoDAO.excluir(previsaoFonteRecurso);
            previsaoFonteRecurso = new PrevisaoFonteRecurso();
            previsoesFonteRecurso = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirPrevisaoFonteRecurso.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b> <p>
     *
     * O método instancia um novo objeto na variável PrevisaoFonteRecurso para limpar as
     * infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        previsaoFonteRecurso = new PrevisaoFonteRecurso();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgPrevisaoFonteRecurso.hide()");
        requestContext.update("formPrevisoesFonteRecurso:dtPrevisoesFonteRecurso");

    }
    
    //get SelectItens
    //
    public List<SelectItem> getPrevisaoDeReceita() {

        previsoesDeReceita = new LinkedList<SelectItem>();
        for (PrevisaoDeReceita previsaoDeReceita : new PrevisaoDeReceitaDAO()
                .listarPrevisoesDeReceita()) {
            previsoesDeReceita.add(new SelectItem(previsaoDeReceita, previsaoDeReceita.toString()));
        }
        return previsoesDeReceita;
    }
    //
    public List<SelectItem> getFontesDeRecurso() {

        fontesDeRecurso = new LinkedList<SelectItem>();
        for (FonteDeRecurso fonteDeRecurso : new FonteDeRecursoDAO()
                .listarFontesDeRecurso()) {
            fontesDeRecurso.add(new SelectItem(fonteDeRecurso, fonteDeRecurso.toString()));
        }
        return fontesDeRecurso;
    }
    
}